home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 236_01 / progs.bc < prev    next >
Text File  |  1989-06-05  |  6KB  |  334 lines

  1. /* EXAMPLE OF I/O STATEMENTS */
  2. GLOBAL
  3. MAIN
  4. CHAR *S = "STRING", *FLNAME = "TDAT.G"
  5. INTEGER A = 234, B = 678
  6. OPEN #1, "DATA.TST", "w"
  7. PRINT #1, "%s %d %d", S, A, B
  8. CLOSE #1
  9. OPEN #1, "DATA.TST", "r"
  10. INPUT #1, "%s %d %d", *S, A, B
  11. CLOSE #1
  12. PRINT "%s %d %d \n", S, A, B
  13. LIST(FLNAME)
  14. END IOEX
  15.  
  16. FUNCTION LIST(FILENAME)
  17. CHAR *FILENAME
  18. BEGIN
  19. CHAR C
  20. OPEN #4, FILENAME, "r"
  21. WHILE (C = getc(fp4)) <> EOF
  22.   putchar(C);
  23. ENDWH
  24. CLOSE#4
  25. END LIST
  26.  
  27. /* ERATOSTHENES SIEVE */
  28. GLOBAL
  29. CON SIZE 8190
  30. MAIN
  31. INTEGER ITER, COUNT, I, K
  32. INTEGER PRIME, FLAG[8191]
  33. PRINT "10 ITERATIONS \n"
  34. FOR ITER = 1 TO 10
  35.   COUNT = 0
  36.   FOR I = 0 TO SIZE
  37.     FLAG[I] = 1
  38.   NEXT I
  39.   FOR I = 0 TO SIZE
  40.     IF FLAG[I] <> 0
  41.       PRIME = I+I+3
  42.       K = I + PRIME
  43.       WHILE K <= SIZE
  44.         FLAG[K] = 0
  45.         K = K + PRIME
  46.       ENDWH
  47.       COUNT++
  48.     ENDIF
  49.   NEXT I
  50. NEXT ITER
  51. PRINT " %d PRIMES \n", COUNT
  52. END SIEVE
  53.  
  54. /* EIGHT QUEENS CHESS PROBLEM */
  55. GLOBAL
  56. INTEGER COLFREE[8], X[8]
  57. INTEGER UPFREE[15], DOWNFREE[15]
  58. INTEGER R, K
  59. MAIN
  60. /* INITIALIZE EMPTY BOARD */
  61. FOR K=0 TO 7
  62.   COLFREE[K] = TRUE
  63. NEXT K
  64. FOR K=0 TO 14
  65.   UPFREE[K] = DOWNFREE[K] = TRUE
  66. NEXT K
  67. R = -1
  68. ADDQUEEN()
  69. END QUEEN8
  70.  
  71. FUNCTION ADDQUEEN()
  72. BEGIN
  73. INTEGER C
  74. R++
  75. FOR C=0 TO 7
  76.   /* IS SQUARE[R,C] FREE? */
  77.   IF COLFREE[C] AND UPFREE[R-C+7] AND DOWNFREE[R+C]
  78.     /* SET QUEEN ON SQUARE[R,C] */
  79.     X[R] = C
  80.     COLFREE[C] = UPFREE[R-C+7] = DOWNFREE[R+C] = FALSE
  81.     IF R == 7
  82.       PRINT "\n CONFIGURATION \n"
  83.       FOR K=0 TO 7
  84.         PRINT " %d", X[K]
  85.       NEXT K
  86.       STOP
  87.     ELSE ADDQUEEN()
  88.     ENDIF
  89.     /* REMOVE QUEEN FROM SQUARE[R,C)] */
  90.     COLFREE[C] = UPFREE[R-C+7] = DOWNFREE[R+C] = TRUE
  91.   ENDIF
  92. NEXT C
  93. R--
  94. END ADDQUEEN
  95.  
  96. /* PRODUCT OF TWO MATRICES OF VARIABLE DIMENSIONS */
  97. GLOBAL
  98. CON DLIM 21
  99. MAIN
  100. REAL A[DLIM,DLIM], B[DLIM,DLIM], C[DLIM,DLIM]
  101. INTEGER I,J,K, N1,N2,N3
  102. PRINT "DIMENSIONS = "
  103. INPUT "%d %d %d", N1, N2, N3
  104. /* GENERATE MATRICES */
  105. FOR J=1 TO N2
  106.   FOR I=1 TO N1
  107.     A[I,J] = (REAL)(J-I)
  108.   NEXT I
  109.   FOR K=1 TO N3
  110.     B[J,K] = (REAL)(J+K)
  111.   NEXT K
  112. NEXT J
  113. MATPRI(A,N1,N2)
  114. MATPRI(B,N2,N3)
  115. MULT(A,B,C,N1,N2,N3)
  116. MATPRI(C,N1,N3)
  117. END MAIN
  118.  
  119. FUNCTION MULT(E,F,G, L1,L2,L3)
  120. REAL E[DLIM,DLIM], F[DLIM,DLIM], G[DLIM,DLIM]
  121. INTEGER L1, L2, L3
  122. BEGIN
  123. INTEGER I,J,K
  124. FOR I=1 TO L1
  125.   FOR K=1 TO L3
  126.     G[I,K] = 0
  127.     FOR J=1 TO L2
  128.       G[I,K] = G[I,K]+E[I,J]*F[J,K]
  129.     NEXT J
  130.   NEXT K
  131. NEXT I
  132. END MULT
  133.  
  134. FUNCTION MATPRI(A, L1,L2)
  135. REAL A[DLIM,DLIM]; INTEGER L1, L2
  136. BEGIN
  137. INTEGER I,J
  138. PRINT "\n"
  139. FOR I=1 TO L1
  140.   FOR J=1 TO L2
  141.     PRINT "%8.3f", A[I,J]
  142.   NEXT J
  143.   PRINT "\n"
  144. NEXT I
  145. END MATPRI
  146.  
  147. /* EXAMPLE USING CONDITIONAL STATEMENTS */
  148. GLOBAL
  149. MAIN
  150. CHAR  *S = "@$^&*+"
  151. INTEGER I
  152. FOR I=1 TO 5
  153.   IF S[I] == '@'
  154.     PRINT "@"
  155.   ELSE IF S[I] == '+'
  156.     PRINT "$"
  157.   ELSE IF S[I] == '^'
  158.     PRINT "^"
  159.   ELSE
  160.     PRINT "NO MATCH"
  161.   ENDIF
  162. NEXT I
  163. END CONDIT
  164.  
  165. /* TOWERS OF HANOI */
  166. GLOBAL
  167. CON NDISK 64
  168. MAIN
  169. MOVE(NDISK, 1, 3, 2)
  170. END HANOI
  171.  
  172. FUNCTION MOVE(N, A, B, C)
  173. INTEGER N, A, B, C
  174. BEGIN
  175. IF N > 0
  176.   MOVE(N-1, A, C, B)
  177.   PRINT "MOVE A DISK FROM %d TO %d \n", A, B
  178.   MOVE(N-1, C, B, A)
  179. ENDIF
  180. END MOVE
  181.  
  182. /* INVERSE AND DETERMINANT OF SYMMETRIC MATRIX */
  183. GLOBAL
  184. CON DLIM 31
  185. MAIN
  186. REAL A[DLIM,DLIM],R[DLIM,DLIM],DET,SINV()
  187. INTEGER I,J,ND
  188. PRINT "ND = "
  189. INPUT "%d", ND
  190. /* GENERATE ND X ND MATRIX */
  191. FOR I=1 TO ND
  192.   FOR J=1 TO ND
  193.     A[I,J]=1.
  194.   NEXT J
  195.   A[I,I]=2.
  196. NEXT I
  197. MATPRI(A,ND,ND)
  198. DET=SINV(A,R,ND)
  199. MATPRI(R,ND,ND)
  200. PRINT "%10.3f\n", DET
  201. ENDMAIN
  202.  
  203. REAL FUNCTION SINV(A,R,NN)
  204. REAL A[DLIM,DLIM], R[DLIM,DLIM]
  205. INTEGER NN
  206. BEGIN
  207. REAL VEC[DLIM],DET,RL
  208. INTEGER I,J,K,L
  209. DET=A[1,1]
  210. R[1,1]=1./A[1,1]
  211. FOR L=2 TO NN
  212.   K=L-1
  213.   RL=A[L,L]
  214.   FOR I=1 TO K
  215.     VEC[I]=0.
  216.     FOR J=1 TO K
  217.       VEC[I]=VEC[I]+R[I,J]*A[L,J]
  218.     NEXT J
  219.     RL=RL-A[L,I]*VEC[I]
  220.   NEXT I
  221.   DET=DET*RL
  222.   FOR I=1 TO K
  223.     R[L,I]=-VEC[I]/RL
  224.     R[I,L]=R[L,I]
  225.   NEXT I
  226.   FOR I=1 TO K
  227.     FOR J=I TO K
  228.       R[I,J]=R[I,J]-VEC[I]*R[L,J]
  229.       R[J,I]=R[I,J]
  230.     NEXT J
  231.   NEXT I
  232.   R[L,L]=1./RL
  233. NEXT L
  234. RETURN(DET)
  235. END SINV
  236.  
  237. /* SHELL-METZNER SORT */
  238. GLOBAL
  239. CON DLIM 101
  240. CON NN 20
  241. MAIN
  242. INTEGER X[DLIM]
  243. /* GENERATE VECTOR */
  244. FOR I=1 TO N
  245.   X[I] = N-I+1
  246. NEXT I
  247. PRVEC(X,L)
  248. SZSORT(X,L)
  249. PRVEC(X,L)
  250. END SORT
  251.  
  252. FUNCTION SZSORT(X,N)
  253. INTEGER X,N
  254. BEGIN
  255. INTEGER KT,TP,I,J, K = 1
  256. WHILE K < N
  257.   K = 2*K
  258. ENDWH
  259. K = K/2 - 1
  260. WHILE K >= 1
  261.   KT=1
  262.   WHILE KT > 0
  263.     J = K
  264.     KT = 0
  265.     FOR I=1 TO N
  266.       J++
  267.       IF J <= N AND X[I] > X[J]
  268.         TP=X[I];X[I]=X[J];X[J]=TP
  269.         KT++
  270.       ENDIF
  271.     NEXT I
  272.   ENDWH
  273.   K = K/2
  274. ENDWH
  275. END SZSORT
  276.  
  277. FUNCTION PRVEC(A,LL)
  278. INTEGER A[], LL
  279. BEGIN
  280. INTEGER I
  281. PRINT "\n"
  282. FOR I=1 TO LL
  283.   PRINT " %d ", A[I]
  284. NEXT I
  285. PRINT "\n"
  286. RETURN
  287. END PRVEC
  288.  
  289. /* FIBONACCI NUMBERS */
  290. GLOBAL
  291. MAIN
  292. INTEGER  N
  293. PRINT "N = "
  294. INPUT "%d", N
  295. PRINT "FIBON = %d\n", FIB(N)
  296. END FIBNUM
  297.  
  298. INTEGER FUNCTION FIB(K)
  299. INTEGER K
  300. BEGIN
  301. IF K <= 2
  302.   RETURN(1)
  303. ELSE
  304.   RETURN(FIB(K-1) + FIB(K-2))
  305. ENDIF
  306. END FIB
  307.  
  308. /* ZERO OF FUNCTION BY NEWTON'S METHOD */
  309. GLOBAL
  310. MAIN
  311. INTEGER NMAX=20
  312. REAL TOL=1.0E-6, X0, X, NEWT()
  313. X0 = 2
  314. X = NEWT(X0,TOL,NMAX)
  315. PRINT "%f \n", X
  316. END NEWTON
  317.  
  318. REAL FUNCTION NEWT(X0,TOL,NMAX)
  319. REAL X0,TOL; INTEGER NMAX
  320. BEGIN
  321. REAL FN(), DFN(), fabs(), X, INC
  322. INTEGER I, N
  323. X = X0
  324. FOR I = 1 TO NMAX
  325.   INC = -FN(X)/DFN(X)
  326.   X = X + INC
  327.   IF fabs(INC) < TOL
  328.     RETURN(X)
  329.   ENDIF
  330. NEXT I
  331. PRINT "NO CONVERGENCE"
  332. STOP
  333. END NEWT
  334.